'''

删除多余列
'''
import os
import pandas as pd
import chardet


def detect_encoding(file_path):
    """检测文件编码"""
    with open(file_path, 'rb') as f:
        raw_data = f.read(10000)  # 读取部分内容进行检测
        result = chardet.detect(raw_data)
        return result['encoding'] or 'gbk'  # 默认使用gbk


def excel_column_to_index(column_letter):
    """将Excel列字母转换为0-based索引"""
    col_index = 0
    # 从右向左处理每个字母
    for i, char in enumerate(reversed(column_letter.upper())):
        # 计算字母的数值（A=1, B=2, ..., Z=26）
        char_value = ord(char) - ord('A') + 1
        # 乘以26的幂次（位置权重）
        col_index += char_value * (26 ** i)
    return col_index - 1  # 转换为0-based索引


# ============== 用户可配置参数 ============== #
input_folder = r"D:\AAAAA\test\2023-2024"  # 源文件夹路径
output_folder = r'D:\AAAAA\out\2023-2024'  # 输出文件夹路径
columns_to_remove = ['AL', 'AM', 'AN', 'AV', 'AW', 'AX']  # 要删除的列对应的字母

# 编码配置 - 根据需要修改这些值
input_encoding = 'auto'  # 'auto'自动检测，或指定如'gbk', 'utf-8', 'big5'
output_encoding = 'utf_8_sig'  # 输出文件编码，推荐'utf_8_sig'或'gbk'
# ========================================== #

# 创建输出文件夹（如果不存在）
os.makedirs(output_folder, exist_ok=True)

# 遍历所有子文件夹和CSV文件
processed_count = 0
error_files = []

for root, dirs, files in os.walk(input_folder):
    for file in files:
        if file.endswith('.csv'):
            file_path = os.path.join(root, file)
            relative_path = os.path.relpath(root, input_folder)

            try:
                # 确定输入文件编码
                if input_encoding == 'auto':
                    encoding = detect_encoding(file_path)
                else:
                    encoding = input_encoding

                print(f"处理文件: {file_path} (编码: {encoding})")

                # 读取CSV文件（使用检测到的编码）
                df = pd.read_csv(file_path, encoding=encoding, engine='python')

                # 打印列名和索引（调试用）
                # print(f"  文件列数: {len(df.columns)}")
                # print(f"  前5个列名: {list(df.columns[:5])}...")

                # 计算要删除的列索引
                drop_columns = []
                for col_letter in columns_to_remove:
                    col_index = excel_column_to_index(col_letter)

                    # 检查列索引是否有效
                    if 0 <= col_index < len(df.columns):
                        col_name = df.columns[col_index]
                        drop_columns.append(col_name)
                        # print(f"  标记删除: {col_letter}列 -> 索引{col_index} ({col_name})")
                    else:
                        print(f"  警告: {col_letter}列索引{col_index}超出范围(0-{len(df.columns) - 1})")

                # 删除指定列
                if drop_columns:
                    df = df.drop(columns=drop_columns)
                    print(f"  已删除列: {', '.join(drop_columns)}")
                else:
                    print("  没有需要删除的列")

                # 创建输出目录并保存文件
                output_dir = os.path.join(output_folder, relative_path)
                os.makedirs(output_dir, exist_ok=True)
                output_path = os.path.join(output_dir, file)

                # 保存CSV文件
                df.to_csv(output_path, index=False, encoding=output_encoding)

                print(f'  处理成功 -> {output_path}\n')
                processed_count += 1

            except Exception as e:
                error_msg = f'处理失败: {file_path}, 错误: {str(e)}'
                print(error_msg)
                error_files.append(error_msg)

print("\n===== 处理完成报告 =====")
print(f"成功处理文件数: {processed_count}")
print(f"失败文件数: {len(error_files)}")

if error_files:
    print("\n失败文件列表:")
    for error in error_files:
        print(error)

print("\n输出文件编码格式:", output_encoding)
